#include <iostream>
using namespace std;

//函数重载
//可以让函数名相同，提高复用性

//函数重载的满足条件：
//1、同一个作用域下
//2、函数名称相同
//3、函数的参数不同:或类型、或个数、或顺序……

//注意事项：
//仅函数的返回值类型不同，不可以作为函数重载的条件

void func()
{
    cout << "func 的调用" << endl;
}

void func(int a)
{
    cout << "func(int a) 的调用!" << endl;
}

void func(double a)
{
    cout << "func(double a) 的调用!" << endl;
}

void func(int a, double b)
{
    cout << "func(int a,double b) 的调用!" << endl;
}

void func(double a, int b)
{
    cout << "func(double a,int b) 的调用!" << endl;
}

//函数重载的注意事项：
//1、引用作为重载的条件
void fun(int& a)// 更加优先
{
    cout << "fun(int& a)调用" << endl;
}

void fun(const int& a)
{
    cout << "fun(const int& a)调用" << endl;
}

//2、函数重载碰到默认参数
void func2(int a,int b = 10)
{
    cout << "func(int a,int b = 10) 的调用" << endl;
}

void func2(int a)
{
    cout << "func(int a) 的调用" << endl;
}

/*
    可以初始化默认参数
    在同一范围内仅一次
*/
void fun3(int x = 7);
//void fun3(int x = 8); //error: redefinition


int main()
{
    //参数个数、类型、顺序不同
    func();

    func(10);

    func(3.14);

    func(1, 1.2);
    
    func(2.1, 3);

    int a = 10;
    fun(a);

    fun(10);//error: int& a = 10;
            //合法： const int& a = 10;

    //func2(10);     //重载碰到默认参数，出现了二义性
    
    return 0;
}